/**
 * 参数归一化思想：
 * 将多种参数归一化到一种参数，方便后续处理，一般处理成函数
 */

// eg1：按要求组合数组内容
// 需要一个方法，将传入的对象数组，按要求条件对对象数组重新进行组合返回

function combineArray(arr, proKeyFn) {
  const result = {};
  // proKeyFn 可能是一个函数，也可能是一个字符串
  // 1. 先将proKeyFn 转换成函数，归一化参数
  if (typeof proKeyFn === "string") {
    let proKey = proKeyFn;
    proKeyFn = function (item) {
      return item[proKey];
    };
  }

  arr.forEach((item) => {
    const key = proKeyFn(item);
    if (result[key]) {
      result[key].push(item);
    } else {
      result[key] = [item];
    }
  });

  return result;
}

const arr = [
  { name: "张三", age: 18 },
  { name: "李四", age: 20 },
  { name: "王五", age: 18 },
  { name: "赵六", age: 20 },
];

console.log(combineArray(arr, "age"));
console.log(combineArray(arr, (item) => item.age));
console.log(combineArray(arr, (item) => item.name));
// key还可以自行多加其他字符串
console.log(combineArray(arr, (item) => item.name + "-姓名"));
